package com.study.system;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @Author 669
 * @CreateDate 2022/4/19 9:05
 * @Version 1.0
 */

/**
 * 这是最基础的 Servlet父类， 子类可以通过继承，在一个类中使用本类方法。
 * 继承HttpServlet，重写serice方法，通过反射来调用当前类中已有的方法，
 * 在后面的开发中，创建的Servlet(其实是类)，只需要继承这个BaseServlet即可，
 * 而继承了BaseServlet的子类不管增加方法，还是删除方法，BaseServlet都不需要修改源代码，
 * 这样就可以大大减少代码量，简化了操作。
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取请求路径
        String uri = req.getRequestURI();
        //获取方法名
        int index = uri.lastIndexOf('/');
        String MethodName = uri.substring(index + 1);

        //获取需要调用的字节码文件
        Class<? extends BaseServlet> cls = this.getClass();

        try {
            //获取反射对象得到对应方法
            Method method = cls.getMethod(MethodName, HttpServletRequest.class, HttpServletResponse.class);
            //调用对应方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
